#include"../mqserver/mq_message.hpp"
#include<gtest/gtest.h>

xiang11mq::MessageManager::ptr mmp;

class MessageTest : public testing::Environment
{
public:
    virtual void SetUp() override
    {
        std::cout << "单元测试执行前的环境初始化开始" << std::endl;
        mmp = std::make_shared<xiang11mq::MessageManager>("./data/message/");
        mmp->initQueueMessage("queue1");
        std::cout << "单元测试执行前的环境初始化结束" << std::endl;
    }
    virtual void TearDown() override
    {
        std::cout << "单元测试执行完毕后的环境清理开始" << std::endl;
        mmp->clear();
        std::cout << "单元测试执行完毕后的环境清理结束" << std::endl;
    }
};

//恢复消息测试
// TEST(recovery_test, delete_test) 
// {
//     ASSERT_EQ(mmp->getable_count("queue1"),4);
// }

//新增消息测试 观察可获取消息数量 持久化消息数量
TEST(message_test, insert_test)
{   
    xiang11mq::BasicProperties properties;
    properties.set_id(xiang11mq::UUIDHelper::uuid());
    properties.set_deliver_mode(xiang11mq::DeliverMode::DURABLE);
    properties.set_routing_key("news.music.pop");
    mmp->insert("queue1", &properties, "hello-world-1", xiang11mq::DeliverMode::DURABLE);
    mmp->insert("queue1", nullptr, "hello-world-2", xiang11mq::DeliverMode::DURABLE);
    mmp->insert("queue1", nullptr, "hello-world-3", xiang11mq::DeliverMode::DURABLE);
    mmp->insert("queue1", nullptr, "hello-world-4", xiang11mq::DeliverMode::DURABLE);
    mmp->insert("queue1", nullptr, "hello-world-5", xiang11mq::DeliverMode::UNDURABLE);

    ASSERT_EQ(mmp->getable_count("queue1"), 5); //可获取消息/待推送消息
    ASSERT_EQ(mmp->total_count("queue1"), 4);   //总持久化数量
    ASSERT_EQ(mmp->durable_count("queue1"), 4); // 持久化/有效消息数量
    ASSERT_EQ(mmp->waitack_count("queue1"), 0); //待确认数量

}

//获取消息测试 获取一条消息 在确认前 查看可获取消息数量 待确认消息数量 以及测试消息获取的顺序
// TEST(message_test, select_test) 
// {
//     xiang11mq::MessagePtr msg1 = mmp->front("queue1");
//     ASSERT_EQ(msg1->payload().body(),std::string("hello-world-1"));
//     ASSERT_EQ(mmp->getable_count("queue1"), 4);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 1);

//     xiang11mq::MessagePtr msg2 = mmp->front("queue1");
//     ASSERT_EQ(msg2->payload().body(),std::string("hello-world-2"));
//     ASSERT_EQ(mmp->getable_count("queue1"), 3);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 2);

//     xiang11mq::MessagePtr msg3 = mmp->front("queue1");
//     ASSERT_EQ(msg3->payload().body(),std::string("hello-world-3"));
//     ASSERT_EQ(mmp->getable_count("queue1"), 2);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 3);

//     xiang11mq::MessagePtr msg4 = mmp->front("queue1");
//     ASSERT_EQ(msg4->payload().body(),std::string("hello-world-4"));
//     ASSERT_EQ(mmp->getable_count("queue1"), 1);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 4);

//     xiang11mq::MessagePtr msg5 = mmp->front("queue1");
//     ASSERT_EQ(msg5->payload().body(),std::string("hello-world-5"));
//     ASSERT_EQ(mmp->getable_count("queue1"), 0);
//     ASSERT_EQ(mmp->waitack_count("queue1"), 5);

//     xiang11mq::MessagePtr msg6 = mmp->front("queue1");
//     ASSERT_EQ(msg6.get(), nullptr);
// }

//删除消息测试 确认一条消息 查看持久化消息数量 待确认消息数量
TEST(message_test, delete_test) 
{
    xiang11mq::MessagePtr msg1 = mmp->front("queue1");
    ASSERT_EQ(msg1->payload().body(),std::string("hello-world-1"));
    ASSERT_EQ(mmp->getable_count("queue1"), 4);
    ASSERT_EQ(mmp->waitack_count("queue1"), 1);
    mmp->ack("queue1", msg1->payload().properties().id());
    ASSERT_EQ(mmp->getable_count("queue1"), 4);
    ASSERT_EQ(mmp->waitack_count("queue1"), 0);
    ASSERT_EQ(mmp->durable_count("queue1"), 3);
    ASSERT_EQ(mmp->total_count("queue1"), 4);

}

int main(int argc, char* argv[])
{
    testing::InitGoogleTest(&argc, argv);

    testing::AddGlobalTestEnvironment(new MessageTest);
    //testing::AddGlobalTestEnvironment(new MyMapTest);
    int ret = RUN_ALL_TESTS();
    return 0;
}